package MyFramePro.Service.Impl;

import MyFramePro.Constants.SystemConstants;
import MyFramePro.Domain.Dto.TagDTO;
import MyFramePro.Domain.Entity.Tag;
import MyFramePro.Domain.ResponseResult;
import MyFramePro.Domain.Vo.PageVo;
import MyFramePro.Domain.Vo.TagVo;
import MyFramePro.Mapper.TagMapper;
import MyFramePro.Service.TagService;
import MyFramePro.Utils.BeanCopyUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 标签(Tag)表服务实现类
 */
@Service("tagService")
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements TagService {

    @Resource
    private TagServiceImpl tagService;

    @Resource
    private TagMapper tagMapper;

    /**
     * 这里是标签的分页功能
     */
    @Override
    public ResponseResult pageTagList(Integer pageNum, Integer pageSize, TagDTO tagDTO) {

        LambdaQueryWrapper<Tag> queryWrapper = new LambdaQueryWrapper<>();
        //1.查询标签分页信息中对应的 标签名、备注 信息
        queryWrapper.eq(StringUtils.hasText(tagDTO.getName()),Tag::getName,tagDTO.getName()); //进行不为空的判断
        queryWrapper.eq(StringUtils.hasText(tagDTO.getRemark()),Tag::getRemark,tagDTO.getRemark());
        queryWrapper.eq(Tag::getDelFlag, SystemConstants.TAG_DEL_FLAG); //表示未删除状态

        //2.根据限制信息进行分页显示
        Page<Tag> tagPage = new Page<>();
        tagPage.setCurrent(pageNum);
        tagPage.setSize(pageSize);
        tagService.page(tagPage,queryWrapper);
        //2.1获取分页的信息与查询总数
        List<Tag> records = tagPage.getRecords();
        long total = tagPage.getTotal();

        //3.由于前端字段的需求，这里使用 Vo 类型进行封装
        PageVo pageVo = new PageVo(records,total);

        return ResponseResult.okResult(pageVo);
    }


    /**
     * 这里是进行新增标签的功能
     */
    @Override
    public ResponseResult addTag(Tag tag) {

        tagMapper.insert(tag);

        return ResponseResult.okResult();
    }

    /**
     * 这里是进行删除标签的功能
     */
    @Override
    public ResponseResult deleteTag(Long id) {
        //1.根据传入的 ID 进行逻辑删除
        tagMapper.deleteById(id);

        return ResponseResult.okResult();
    }

    /**
     * 这里是获取标签信息的功能
     */
    @Override
    public ResponseResult getTaginfo(Long tagId) {

        Tag tag = tagMapper.selectById(tagId);

        return ResponseResult.okResult(tag);
    }


    /**
     * 这里是修改标签的功能
     */
    @Override
    public ResponseResult updateTag(Tag tag) {
//        LambdaUpdateWrapper<Tag> updateWrapper = new LambdaUpdateWrapper<>();
//        updateWrapper.set(Tag::getName,tag.getName())
//                        .set(Tag::getRemark,tag.getRemark())
//                                .eq(Tag::getId,tag.getId());
//
//        tagService.update(updateWrapper);

        tagService.saveOrUpdate(tag);

        return ResponseResult.okResult();
    }


    /**
     * 这里是查询所有标签接口的功能
     */
    @Override
    public List<TagVo> getListAllTag() {

        //1.查询相关的字段
        LambdaQueryWrapper<Tag> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(Tag::getId,Tag::getName);

        List<Tag> tagList = tagService.list(queryWrapper);

        //2.由于前端需求字段，所以转换为 Vo 类型
        List<TagVo> tagVos = BeanCopyUtils.myCopyBeanList(tagList, TagVo.class);

        return tagVos;
    }





}

